package app

import (
	"encoding/gob"
	"fmt"
	"odm/logger"
	"os"
	"path"
)

// getPid 获取进程号
func getPid() (int, error) {
	pid := 0
	// 打开文件
	file, err := os.Open(path.Join("system", "pid.gob"))
	if err != nil {
		return 0, err
	}
	defer file.Close()
	// 解码gob文件
	decoder := gob.NewDecoder(file)
	if err := decoder.Decode(&pid); err != nil {
		return 0, err
	}
	return pid, nil
}

// savePid 保存进程号
func savePid() error {
	// 获取是否有运行的进程号
	pid, err := getPid()
	if err == nil {
		logger.Errorf("odm server pid %d is exist", pid)
		return fmt.Errorf("odm server pid %d is exist", pid)
	}
	if !os.IsNotExist(err) {
		logger.Errorf("get pid error:[%s]", err.Error())
		return err
	}
	// 创建当前进程号文件
	file, err := os.OpenFile(path.Join("system", "pid.gob"), os.O_CREATE|os.O_WRONLY, 0666)
	if err != nil {
		logger.Error(err)
		return err
	}
	defer file.Close()
	// 获取当前进程号
	pid = os.Getpid()
	encoder := gob.NewEncoder(file)
	if err := encoder.Encode(pid); err != nil {
		logger.Error(err)
		return err
	}
	logger.Infof("save odm server pid %d success", pid)
	return nil
}

// removePid 退出进程前清理数据
func removePid() {
	logger.Info("odm server remove pid.gob success")
	os.Remove(path.Join("system", "pid.gob"))
}
